import { NgModule, Optional, SkipSelf } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AppStoreModule } from '../store/store.module';

@NgModule({
  declarations: [],
  imports: [
    BrowserModule,
    HttpClientModule,
    BrowserAnimationsModule,
    AppStoreModule
  ]
})
export class CoreModule {

  /**
   * CoreModule 只允许在 AppModule 中注入一次。
   *
   * @Optional(): 当注入对象没有找到时，自动给它赋值为 null。由于在第一次注入时，CoreModule 是没有的，
   * @SkipSelf(): 允许跳过自身，从父级查找。避免无限循环，不断注入自身。
   *
   * @param parentModule 父模块
   */
  constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
    this.throwIfAlreadyLoadedModule(parentModule, 'CoreModule');
  }

  private throwIfAlreadyLoadedModule(parentModule: any, moduleName: string): void {
    if (parentModule) {
      throw new Error(`${moduleName} has already been loaded. Import CoreModule in the AppModule only.`);
    }
  }
}
